/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package escom.ipn.modelo.dao;
import escom.ipn.modelo.dto.Usuario;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;


/**
 *
 * @author Daniel
 */
public class UsuarioDAO {
  
    public static final String SQL_SELECT =
            "select * from USUARIO "
            + "join CAT_ESTADO_USUARIO ON CAT_ESTADO_USUARIO_id_estado_usuario=id_cat_estado_usuario "
            + "where usuario= ? and password = ? "
            + "and estado='inactivo'";
    public static final String SQL_UPDATE =
            "UPDATE USUARIO SET CAT_ESTADO_USUARIO_id_estado_usuario= ? WHERE ID= ? ";
            
    public static final String SQL_DESPACHADORES_LIBRES =
            "SELECT id FROM usuario "
            +"join cat_estado_usuario on CAT_ESTADO_USUARIO_id_ESTADO_USUARIO=id_cat_estado_usuario "
            +"join CAT_TIPO_USUARIO on CAT_TIPO_USUARIO_id_tipo=id_tipo "
            +"where estado=\"Activo\" "
            +"and CAT_TIPO_USUARIO.nombre=\"Despachador\" "
            + "and usuario.SECTOR_id_sector = ? "
            +"and id not in ("
            + "SELECT  id FROM usuario_incidente "
            + "join usuario on id=usuario_id join cat_estado_usuario on CAT_ESTADO_USUARIO_id_ESTADO_USUARIO=id_cat_estado_usuario "
            + "join CAT_TIPO_USUARIO on CAT_TIPO_USUARIO_id_tipo=id_tipo join incidente on id_incidente = incidente_id "
            + "join CAT_ESTADOS_INCIDENTE on id_estado_incidente = CAT_ESTADOS_INCIDENTE_id_estado_incidente "
            + "where cat_estado_usuario.estado=\"Activo\" "
            + "and CAT_TIPO_USUARIO.nombre=\"Despachador\" "
            + "and CAT_ESTADOS_INCIDENTE.estado != \"Terminado\" "
            + "and usuario.SECTOR_id_sector = ? "
            + "group by id"
            + ");";
    public static final String SQL_DESPACHADORES_MENOS_OCUPADOS =
            "SELECT count(*) As total, id "
            + "FROM usuario_incidente "
            + "join usuario on id=usuario_id "
            + "join cat_estado_usuario on CAT_ESTADO_USUARIO_id_ESTADO_USUARIO=id_cat_estado_usuario "
            + "join CAT_TIPO_USUARIO on CAT_TIPO_USUARIO_id_tipo=id_tipo "
            + "join incidente on id_incidente = incidente_id "
            + "join CAT_ESTADOS_INCIDENTE on id_estado_incidente = CAT_ESTADOS_INCIDENTE_id_estado_incidente "
            + "where cat_estado_usuario.estado=\"Activo\" "
            + "and CAT_TIPO_USUARIO.nombre=\"Despachador\" "
            + "and CAT_ESTADOS_INCIDENTE.estado != \"Terminado\" "
            + "and usuario.SECTOR_id_sector = ? "
            + "group by id "
            + "order by total;";
    
    public static final String SQL_EVENTOS_SIN_CONCLUIR =
            "select * from usuario "
            + "join usuario_incidente on usuario_id=id "
            + "join incidente on incidente_id=id_incidente "
            + "join CAT_ESTADOS_INCIDENTE ON CAT_ESTADOS_INCIDENTE_id_estado_incidente=id_estado_incidente  "
            + "join CAT_TIPO_USUARIO ON CAT_TIPO_USUARIO_id_tipo=id_tipo "
            + "where estado!=\"Terminado\" "
            + "and CAT_TIPO_USUARIO.nombre=\"Despachador\" "
            + "and id=?";


    public Usuario loadLogin(Usuario a,Connection conn)
            throws SQLException {
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = conn.prepareStatement(SQL_SELECT);
            ps.setString(1, a.getUsuario());
            ps.setString(2, a.getPassword());
            rs = ps.executeQuery();
            List resultados = getResults(rs);
            if (resultados.size() > 0) {
                return (Usuario)resultados.get(0);
            } else {
                return null;
            }
        } finally {
            cerrar(rs);
            cerrar(ps);
            cerrar(conn);
        }
    }
    
    public Usuario loadDespachadorLibre(int a,Connection conn)
            throws SQLException {
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = conn.prepareStatement(SQL_DESPACHADORES_LIBRES);
            ps.setInt(1, a);
            ps.setInt(2, a);
            rs = ps.executeQuery();
            List resultados = getResults1(rs);
            if (resultados.size() > 0) {
                return (Usuario)resultados.get(0);
            } else {
                return null;
            }
        } finally {
            cerrar(rs);
            cerrar(ps);
            cerrar(conn);
        }
    }
    public void CambiarEstado(Usuario a, Connection conn)
            throws SQLException {
        PreparedStatement ps = null;
        try {
            ps = conn.prepareStatement(SQL_UPDATE);
            ps.setInt(1, a.getCAT_ESTADO_USUARIO_id_estado_usuario());
            ps.setInt(2, Integer.parseInt(a.getId()));
            ps.executeUpdate();
        } finally {
            cerrar(ps);
            cerrar(conn);
        }
    }
    
    
    public Usuario loadDespachadorMenosOcupado(int a,Connection conn)
            throws SQLException {
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = conn.prepareStatement(SQL_DESPACHADORES_MENOS_OCUPADOS);
            ps.setInt(1, a);
            rs = ps.executeQuery();
            List resultados = getResults1(rs);
            if (resultados.size() > 0) {
                return (Usuario)resultados.get(0);
            } else {
                return null;
            }
        } finally {
            cerrar(rs);
            cerrar(ps);
            cerrar(conn);
        }
    }
    
    public List loadEventosSinConcluir(int a,Connection conn)
            throws SQLException {
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = conn.prepareStatement(SQL_EVENTOS_SIN_CONCLUIR);
            ps.setInt(1, a);
            rs = ps.executeQuery();
            List resultados = getResults1(rs);
            if (resultados.size() > 0) {
                return resultados;
            } else {
                return null;
            }
        } finally {
            cerrar(rs);
            cerrar(ps);
            cerrar(conn);
        }
    }
    
    private List getResults(ResultSet rs)
            throws SQLException {
        List results = new ArrayList();
        while (rs.next()) {
            Usuario a = new Usuario();
            a.setId(rs.getString("id"));
            a.setNombre(rs.getString("nombre"));
            a.setUsuario(rs.getString("usuario"));
            a.setPassword(rs.getString("password"));
            a.setTipoUsuario(rs.getString("CAT_TIPO_USUARIO_id_tipo"));
            a.setSector(rs.getInt("SECTOR_id_sector"));
            results.add(a);
        }
        return results;
    }
    
    private List getResults1(ResultSet rs)
            throws SQLException {
        List results = new ArrayList();
        while (rs.next()) {
            Usuario a = new Usuario();
            a.setId(rs.getString("id"));
            results.add(a);
        }
        return results;
    }
    
    
    
    
    private void cerrar(Connection cnn) {
        if (cnn != null) {
            try {
                cnn.close();
            } catch (SQLException e) {
                //manejo del error
            }
        }
    }

    private void cerrar(PreparedStatement ps) {
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException e) {
                //manejo del error
            }
        }
    }

    private void cerrar(ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                //manejo del error
            }
        }
    }   
}
